
# 从 qtpy 库导入 QtCore 和 QtGui 模块，用于处理核心功能和图形相关操作
from qtpy import QtCore, QtGui
# 从 qtpy 库的 QtWidgets 模块导入所需的类，用于创建 GUI 界面
from qtpy.QtWidgets import QDialog
from qtpy.QtWidgets import QVBoxLayout
from qtpy.QtWidgets import QDialogButtonBox
from qtpy.QtWidgets import QTextEdit


class TextEditingField(QTextEdit):
    """
    TextEditingField 类继承自 QTextEdit，用于提供文本编辑功能，
    并在用户按下 Ctrl + Enter 组合键时发出 accepted 信号。
    """

    # 定义一个信号，当用户按下 Ctrl + Enter 时发射
    accepted = QtCore.Signal()

    def __init__(self, parent=None):
        """
        初始化 TextEditingField 实例。

        :param parent: 父控件，默认为 None
        """
        # 调用父类 QTextEdit 的构造函数
        super(TextEditingField, self).__init__(parent)

    def keyPressEvent(self, event):
        """
        处理键盘按键事件，当检测到用户按下 Ctrl + Enter 组合键时，发射 accepted 信号。

        :param event: 键盘事件对象，包含按键信息
        """
        # 调用父类的 keyPressEvent 方法处理默认的按键事件
        super(TextEditingField, self).keyPressEvent(event)
        # 检查是否同时按下了 Ctrl 键和 Enter 键
        if (
            event.modifiers() == QtCore.Qt.ControlModifier
            and event.key() == QtCore.Qt.Key_Return
        ):
            # 若满足条件，发射 accepted 信号
            self.accepted.emit()


class TextEditDialog(QDialog):
    """
    TextEditDialog 类继承自 QDialog，用于创建一个包含文本编辑区域和按钮框的对话框，
    允许用户编辑文本并提交或取消操作。

    :param font: 文本编辑区域使用的字体
    :param textColor: 文本编辑区域的文本颜色
    :param parent: 父控件，默认为 None
    """

    def __init__(self, font, textColor, parent=None):
        """
        初始化 TextEditDialog 实例。

        :param font: 文本编辑区域使用的字体
        :param textColor: 文本编辑区域的文本颜色
        :param parent: 父控件，默认为 None
        """
        # 调用父类 QDialog 的构造函数
        super(TextEditDialog, self).__init__(parent)
        # 设置窗口标志，此处存在类 'Qt' 的未解析的特性引用问题
        self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint)
        # 设置对话框的初始大小
        self.resize(QtCore.QSize(400, 300))
        # 创建一个垂直布局并设置为对话框的布局
        self.layout = QVBoxLayout(self)
        # 设置布局的边距
        self.layout.setContentsMargins(2, 2, 2, 2)
        # 创建 TextEditingField 实例，用于文本编辑
        self.te = TextEditingField()
        # 连接 TextEditingField 的 accepted 信号到 onAccept 方法
        self.te.accepted.connect(self.onAccept)
        # 保存传入的字体并创建 QFont 对象
        self._font = QtGui.QFont(font)
        # 设置文本编辑区域的文本颜色
        self.te.setTextColor(textColor)
        # 将文本编辑区域添加到布局中
        self.layout.addWidget(self.te)
        # 创建一个包含确定和取消按钮的按钮框，此处存在类 'QDialogButtonBox' 的未解析的特性引用问题
        self.buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel, self
        )
        # 连接按钮框的确定按钮信号到 onAccept 方法
        self.buttons.accepted.connect(self.onAccept)
        # 连接按钮框的取消按钮信号到 onReject 方法
        self.buttons.rejected.connect(self.onReject)
        # 将按钮框添加到布局中
        self.layout.addWidget(self.buttons)
        # 初始化结果变量，用于存储用户编辑的文本和操作结果
        self._result = None

    def zoomIn(self, factor):
        """
        放大文本编辑区域的文本。

        :param factor: 放大的倍数
        """
        self.te.zoomIn(factor)

    def setHtml(self, html):
        """
        设置文本编辑区域的 HTML 内容，并将光标移动到文本末尾。

        :param html: 要设置的 HTML 内容
        """
        # 设置文本编辑区域的 HTML 内容
        self.te.setHtml(html)
        # 全选文本编辑区域的内容
        self.te.selectAll()
        # 设置选中文本的字体大小为 20
        self.te.setFontPointSize(20)
        # 获取文本编辑区域的光标对象
        cursor = self.te.textCursor()
        # 清除光标的选择
        cursor.clearSelection()
        # 将光标移动到文本末尾，此处存在类 'QTextCursor' 的未解析的特性引用问题
        cursor.movePosition(QtGui.QTextCursor.End)
        # 将更新后的光标设置回文本编辑区域
        self.te.setTextCursor(cursor)

    def onReject(self):
        """
        处理用户点击取消按钮的操作，将结果设置为空文本和 False，并关闭对话框。
        """
        self._result = "", False
        # 拒绝对话框，关闭对话框并返回 QDialog.Rejected
        self.reject()

    def getResult(self):
        """
        获取用户编辑的结果。

        :return: 一个元组，包含用户编辑的 HTML 文本和操作结果（True 表示提交，False 表示取消）
        """
        return self._result

    def onAccept(self):
        """
        处理用户点击确定按钮或按下 Ctrl + Enter 的操作，保存用户编辑的 HTML 文本，
        并将结果设置为该文本和 True，然后关闭对话框。
        """
        # 全选文本编辑区域的内容
        self.te.selectAll()
        # 将选中文本的字体大小设置为初始保存的字体大小
        self.te.setFontPointSize(self._font.pointSize())
        # 保存用户编辑的 HTML 文本和操作结果
        self._result = self.te.toHtml(), True
        # 接受对话框，关闭对话框并返回 QDialog.Accepted
        self.accept()